diff --git a/bin/_pman-composer_local_deps.php b/bin/_pman-composer_local_deps.php new file mode 100755 index 0000000..badae7b --- /dev/null +++ b/bin/_pman-composer_local_deps.php @@ -0,0 +1,14 @@ +#!/usr/bin/php +getLocalDeps(); +foreach ($deps as $dep => $path) { + echo "$path\n"; +} \ No newline at end of file diff --git a/bin/p b/bin/p index 561d88a..aedfdfc 100755 --- a/bin/p +++ b/bin/p @@ -20,8 +20,18 @@ function git_status() { fi } +function git_statuses() { + local cwd="$(pwd)" dir + for dir in "$@"; do + cd "$dir" || die + git_status --porcelain + cd "$cwd" + done +} + chdir= all= +composer= args=( "afficher l'état du dépôt" "[-d chdir] [-a patterns...] @@ -29,6 +39,7 @@ args=( Si l'option -a est utilisée, ce script accepte comme arguments une liste de patterns permettant de filtrer les répertoires concernés" -d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations" -a,--all all=1 "faire l'opération sur tous les sous-répertoires de BASEDIR qui sont des dépôts git" + -r,--composer composer=1 "faire l'opération sur tous les projets composer dépendants" ) parse_args "$@"; set -- "${args[@]}" @@ -50,16 +61,23 @@ if [ -n "$all" ]; then dirs+=("${dir%/.git}") done fi - setx cwd=pwd - for dir in "${dirs[@]}"; do - cd "$dir" || die - git_status --porcelain - cd "$cwd" - done + git_statuses "${dirs[@]}" + +elif [ -n "$composer" ]; then + # projets dépendants + git_ensure_gitvcs + setx toplevel=git_get_toplevel + cd "$toplevel" || die + setx cwd=ppath2 . "$OrigCwd" + [ -f composer.json ] || die "$cwd: ce n'est pas un projet composer" + + setx -a dirs="$MYDIR/_pman-composer_local_deps.php" + git_statuses "${dirs[@]}" + else # répertoire courant uniquement - setx toplevel=git_get_toplevel - [ -n "$toplevel" ] && Cwd="$toplevel" + git_ensure_gitvcs + Cwd="$(git_get_toplevel)" args=() isatty || args+=(--porcelain) diff --git a/php/src/tools/pman/ComposerFile.php b/php/src/tools/pman/ComposerFile.php index 5a48a1c..d85a957 100644 --- a/php/src/tools/pman/ComposerFile.php +++ b/php/src/tools/pman/ComposerFile.php @@ -138,6 +138,28 @@ class ComposerFile { } } + function getLocalDeps(): array { + $deps = cl::merge(array_keys($this->getRequires()), array_keys($this->getRequireDevs())); + $paths = []; + foreach ($deps as $dep) { + $path = cl::get(self::PATHS, $dep, $dep); + $path = str_replace("/", "-", $path); + $path = "../$path"; + $paths[$dep] = $path; + } + $repositories = $this->getRepositories(); + $localDeps = []; + foreach ($deps as $dep) { + foreach ($repositories as $key => $repository) { + if ($repository["type"] === "path" && $repository["url"] === $paths[$dep]) { + $localDeps[$dep] = $repository["url"]; + break; + } + } + } + return $localDeps; + } + function print(): void { $contents = json::with($this->data, json::INDENT_TABS); if ($contents) echo "$contents\n";