mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2026-01-06 09:02:59 +01:00
Merge branch 'develop' into dol_print_error_db
This commit is contained in:
@@ -34,6 +34,15 @@ repos:
|
||||
args: [--tab]
|
||||
|
||||
# Run local script
|
||||
#
|
||||
# For instance to update the license in edited files, you could add to local.sh:
|
||||
#
|
||||
# ```shell
|
||||
# #!/bin/bash
|
||||
# MYDIR=$(dirname "$0")
|
||||
# CHANGED_INTERNALS=$(git diff --name-only | grep -v includes)
|
||||
# "$MYDIR/dev/tools/updatelicense.php" $CHANGED_INTERNALS
|
||||
# ```
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: local-precommit-script
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/bin/bash
|
||||
# Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
|
||||
|
||||
#
|
||||
# Script to add codespell exceptions to the ignores lines file.
|
||||
#
|
||||
@@ -18,7 +20,7 @@
|
||||
#
|
||||
# :warning:
|
||||
#
|
||||
# This script only works properly if codespell is install for your CLI.
|
||||
# This script only works properly if codespell is installed for your CLI.
|
||||
# As the configuration is in pyproject.toml, you also need tomli.
|
||||
#
|
||||
# ```shell
|
||||
@@ -50,11 +52,17 @@ fi
|
||||
[ -r "${codespell_ignore_file}" ] || { echo "${codespell_ignore_file} not found" ; exit 1 ; }
|
||||
# Then:
|
||||
# - Run codespell;
|
||||
# - Identify files that have fixes;
|
||||
# - Limit to files under git control;
|
||||
# - Run codespell on selected files;
|
||||
# - For each line, create a grep command to find the lines;
|
||||
# - Execute that command by evaluation
|
||||
codespell . | sed -n -E 's@^([^:]+):[[:digit:]]+:[[:space:]](\S+)[[:space:]].*@grep -P '\''\\b\2\\b'\'' "\1" >> '"${codespell_ignore_file}"'@p' | \
|
||||
while read -r line ; do eval "$line" ; done
|
||||
codespell . \
|
||||
| sed -n -E 's@^([^:]+)@\1@p' \
|
||||
| xargs -r git ls-files -- \
|
||||
| xargs -r codespell -- \
|
||||
| sed -n -E 's@^([^:]+):[[:digit:]]+:[[:space:]](\S+)[[:space:]].*@grep -P '\''\\b\2\\b'\'' -- "\1" >> '"${codespell_ignore_file}"'@p' \
|
||||
| while read -r line ; do eval "$line" ; done
|
||||
|
||||
# Finally, sort and remove duplicates to make merges easier.
|
||||
sort -u -o "${codespell_ignore_file}"{,}
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
# Please add in alphabetical order->(`sort -u` like).
|
||||
EPR->ERP
|
||||
alpahnohtml->alphanohtml
|
||||
choosed->chosen
|
||||
dolibar->dolibarr
|
||||
dollibar->dolibarr
|
||||
dollibarr->dolibarr
|
||||
not de passe->password
|
||||
mot de passe->password
|
||||
choosed->chosen
|
||||
not de passe->password
|
||||
tableau de bord->state board
|
||||
#DoliDB->DoliDB
|
||||
alpahnohtml->alphanohtml
|
||||
|
||||
154
dev/tools/updatelicense.php
Executable file
154
dev/tools/updatelicense.php
Executable file
@@ -0,0 +1,154 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/* Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is furnished
|
||||
* to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Script to update year periods and user/email in headers.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Retrieve Git user information
|
||||
*
|
||||
* @return array{name:string,email:string}
|
||||
*/
|
||||
function getGitUserInfo()
|
||||
{
|
||||
$name = trim(shell_exec('git config user.name'));
|
||||
$email = trim(shell_exec('git config user.email'));
|
||||
return ['name' => $name, 'email' => $email];
|
||||
}
|
||||
|
||||
const PREFIXES = [
|
||||
'sh' => ['# ', '# ', '', '#!'],
|
||||
'php' => ['/* ', ' * ', ' */', '<?php'],
|
||||
];
|
||||
|
||||
/**
|
||||
* Update or add copyright notice in a file
|
||||
*
|
||||
* @param $filename string Path to the file to modify
|
||||
* @param $fileType string Filetype identification for the file
|
||||
* @param $name string Name of developer to add in header
|
||||
* @param $email string Email for the developer
|
||||
*
|
||||
* @return bool True if license was updated
|
||||
*/
|
||||
function updateCopyrightNotice($filename, $fileType, $name, $email)
|
||||
{
|
||||
// Determine the appropriate prefix based on file type
|
||||
if (!array_key_exists($fileType, PREFIXES)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get configuration for the filetype
|
||||
list($prefix0, $prefix1, $prefix2, $prefix3) = PREFIXES[$fileType];
|
||||
$r_prefix0 = preg_quote($prefix0);
|
||||
$r_prefix1 = preg_quote($prefix1);
|
||||
$r_prefix3 = preg_quote($prefix3);
|
||||
$r_name = preg_quote($name);
|
||||
$r_email = preg_quote($email);
|
||||
|
||||
// Read the first n lines of the file
|
||||
$n = 50;
|
||||
$lines = implode('', array_slice(file($filename), 0, $n));
|
||||
|
||||
// Define the regex pattern for matching copyright notices
|
||||
$pattern = "~(?:{$r_prefix0}|{$r_prefix1})Copyright \(C\)\s+(?:(?:\d{4}-)?(?<year>\d{4}))\s+{$r_name}\s*\<{$r_email}>~";
|
||||
|
||||
// Check if the lines match the pattern
|
||||
if (preg_match($pattern, $lines, $matches)) {
|
||||
$existingYear = $matches['year'];
|
||||
|
||||
// Check if the existing year is different from the current year
|
||||
if ($existingYear !== date('Y')) {
|
||||
// Update the year range to include or be up to the current year
|
||||
$updatedNotice = preg_replace('/(\d{4})(-\d{4})?\s+/', $existingYear . '-' . date('Y') . "\t", $matches[0]);
|
||||
|
||||
// Replace the old notice with the updated one in the file
|
||||
file_put_contents($filename, preg_replace($pattern, $updatedNotice, file_get_contents($filename)));
|
||||
return true; // Change detected
|
||||
}
|
||||
// If the existing year is the same, no need to update
|
||||
} else {
|
||||
// Adjust tabs for proper alignment
|
||||
$emailTabs = str_repeat("\t", (int) (max(0, (31 - mb_strlen($name)) / 4)));
|
||||
|
||||
// No match found, add a new line to the header
|
||||
$newNotice = "Copyright (C) " . date('Y') . "\t\t" . $name . $emailTabs . "<" . $email . ">";
|
||||
|
||||
// Read the file content
|
||||
$fileContent = file_get_contents($filename);
|
||||
|
||||
// Check if there are existing copyright notices
|
||||
$pos = max(strrpos($fileContent, "{$prefix0}Copyright"), strrpos($fileContent, "{$prefix1}Copyright"));
|
||||
|
||||
if ($pos !== false) {
|
||||
// Add the new notice behind the last preceding copyright notices
|
||||
$pos = strpos($fileContent, "\n", $pos) + 1;
|
||||
$fileContent = substr_replace($fileContent, $prefix1 . $newNotice . "\n", $pos, 0);
|
||||
} elseif (strpos($fileContent, $prefix3) !== false) {
|
||||
// Add the new notice after the shebang or '<?php' line
|
||||
$fileContent = preg_replace("~{$r_prefix3}.*\n~", "$0$prefix0$newNotice\n$prefix2\n", $fileContent, 1);
|
||||
} else {
|
||||
return false; // No change detected
|
||||
}
|
||||
|
||||
// Write the updated content back to the file
|
||||
file_put_contents($filename, $fileContent);
|
||||
return true; // Change detected
|
||||
}
|
||||
|
||||
return false; // No change detected
|
||||
}
|
||||
|
||||
// Main program
|
||||
|
||||
// Check if filenames are provided as parameters
|
||||
if ($argc < 2) {
|
||||
echo "Usage: php " . __FILE__ . " <filename1> [<filename2> ...]" . PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Process each filename provided
|
||||
$changesDetected = false;
|
||||
for ($i = 1; $i < $argc; $i++) {
|
||||
$filename = $argv[$i];
|
||||
|
||||
// Determine file type based on extension
|
||||
$fileType = pathinfo($filename, PATHINFO_EXTENSION);
|
||||
|
||||
// Retrieve Git user information
|
||||
$gitUserInfo = getGitUserInfo();
|
||||
$name = $gitUserInfo['name'];
|
||||
$email = $gitUserInfo['email'];
|
||||
|
||||
// Update or add copyright notice based on file type
|
||||
$changeDetected = updateCopyrightNotice($filename, $fileType, $name, $email);
|
||||
$changesDetected |= $changeDetected;
|
||||
if ($changeDetected) {
|
||||
echo "Copyright notice updated in '$filename'" . PHP_EOL;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$changesDetected) {
|
||||
echo "No changes needed in any file" . PHP_EOL;
|
||||
}
|
||||
@@ -62,7 +62,7 @@ $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("pa
|
||||
|
||||
// Security check
|
||||
$id = (GETPOST('facid', 'int') ? GETPOST('facid', 'int') : GETPOST('id', 'int'));
|
||||
$lineid = GETPOST('lineid', 'int');
|
||||
$lineid = GETPOSTINT('lineid');
|
||||
$title = GETPOST('title', 'alpha');
|
||||
$libelle = GETPOST('libelle', 'alpha');
|
||||
$ref_supplier = GETPOST('ref_supplier', 'alpha');
|
||||
@@ -194,7 +194,7 @@ if (empty($reshook)) {
|
||||
$object->title = GETPOST('title', 'alphanohtml');
|
||||
$object->libelle = GETPOST('libelle', 'alpha'); // deprecated
|
||||
$object->label = GETPOST('libelle', 'alpha');
|
||||
$object->fk_project = GETPOST('projectid', 'int');
|
||||
$object->fk_project = GETPOSTINT('projectid');
|
||||
$object->ref_supplier = GETPOST('ref_supplier', 'alphanohtml');
|
||||
|
||||
$object->note_private = GETPOST('note_private', 'restricthtml');
|
||||
|
||||
@@ -183,7 +183,7 @@ if (empty($reshook)) {
|
||||
$halfday = 1;
|
||||
}
|
||||
|
||||
$approverid = GETPOST('valideur', 'int');
|
||||
$approverid = GETPOSTINT('valideur');
|
||||
$description = trim(GETPOST('description', 'restricthtml'));
|
||||
|
||||
// Check that leave is for a user inside the hierarchy or advanced permission for all is set
|
||||
|
||||
@@ -132,7 +132,7 @@ if (empty($reshook)) {
|
||||
|
||||
if (!$error) {
|
||||
$object->label = GETPOST('label');
|
||||
$object->fk_bank = GETPOST('accountid');
|
||||
$object->fk_bank = GETPOSTINT('accountid');
|
||||
$object->capital = $capital;
|
||||
$object->datestart = $datestart;
|
||||
$object->dateend = $dateend;
|
||||
@@ -140,7 +140,7 @@ if (empty($reshook)) {
|
||||
$object->rate = $rate;
|
||||
$object->note_private = GETPOST('note_private', 'restricthtml');
|
||||
$object->note_public = GETPOST('note_public', 'restricthtml');
|
||||
$object->fk_project = GETPOST('projectid', 'int');
|
||||
$object->fk_project = GETPOSTINT('projectid');
|
||||
$object->insurance_amount = GETPOST('insurance_amount', 'int');
|
||||
|
||||
$accountancy_account_capital = GETPOST('accountancy_account_capital');
|
||||
|
||||
@@ -575,7 +575,7 @@ if (empty($reshook)) {
|
||||
// Set barcode_type_xxx from barcode_type id
|
||||
$stdobject = new GenericObject($db);
|
||||
$stdobject->element = 'product';
|
||||
$stdobject->barcode_type = GETPOST('fk_barcode_type');
|
||||
$stdobject->barcode_type = GETPOSTINT('fk_barcode_type');
|
||||
$result = $stdobject->fetch_barcode();
|
||||
if ($result < 0) {
|
||||
$error++;
|
||||
@@ -817,7 +817,7 @@ if (empty($reshook)) {
|
||||
// Set barcode_type_xxx from barcode_type id
|
||||
$stdobject = new GenericObject($db);
|
||||
$stdobject->element = 'product';
|
||||
$stdobject->barcode_type = GETPOST('fk_barcode_type');
|
||||
$stdobject->barcode_type = GETPOSTINT('fk_barcode_type');
|
||||
$result = $stdobject->fetch_barcode();
|
||||
if ($result < 0) {
|
||||
$error++;
|
||||
|
||||
@@ -663,10 +663,10 @@ class Product extends CommonObject
|
||||
$this->ref = dol_sanitizeFileName(dol_string_nospecial(trim($this->ref)));
|
||||
}
|
||||
$this->label = trim($this->label);
|
||||
$this->price_ttc = price2num($this->price_ttc);
|
||||
$this->price = price2num($this->price);
|
||||
$this->price_min_ttc = price2num($this->price_min_ttc);
|
||||
$this->price_min = price2num($this->price_min);
|
||||
$this->price_ttc = (float) price2num($this->price_ttc);
|
||||
$this->price = (float) price2num($this->price);
|
||||
$this->price_min_ttc = (float) price2num($this->price_min_ttc);
|
||||
$this->price_min = (float) price2num($this->price_min);
|
||||
if (empty($this->tva_tx)) {
|
||||
$this->tva_tx = 0;
|
||||
}
|
||||
@@ -4542,7 +4542,7 @@ class Product extends CommonObject
|
||||
*
|
||||
* @param int $fk_parent Id of parent kit product
|
||||
* @param int $fk_child Id of child product
|
||||
* @return int Return integer <0 if KO, >0 if OK
|
||||
* @return int Return 1 or 0; -1 if error
|
||||
*/
|
||||
public function is_sousproduit($fk_parent, $fk_child)
|
||||
{
|
||||
@@ -4562,9 +4562,9 @@ class Product extends CommonObject
|
||||
$this->is_sousproduit_qty = $obj->qty;
|
||||
$this->is_sousproduit_incdec = $obj->incdec;
|
||||
|
||||
return true;
|
||||
return 1;
|
||||
} else {
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
dol_print_error($this->db);
|
||||
|
||||
Reference in New Issue
Block a user