From 7c1cfabb4a132ed8f8b80e864afb0eb6f1316e48 Mon Sep 17 00:00:00 2001 From: Sandrine Pataut Date: Fri, 1 Aug 2025 11:38:04 +0200 Subject: [PATCH 01/12] refactor tests to remove the embedded git --- src/subcommand/commit_subcommand.cpp | 2 +- test/conftest.py | 15 +- .../status_data/embedded_git/COMMIT_EDITMSG | 1 - test/data/status_data/embedded_git/HEAD | 1 - test/data/status_data/embedded_git/config | 5 - .../data/status_data/embedded_git/description | 1 - .../embedded_git/hooks/applypatch-msg.sample | 15 -- .../embedded_git/hooks/commit-msg.sample | 24 --- .../hooks/fsmonitor-watchman.sample | 174 ------------------ .../embedded_git/hooks/post-update.sample | 8 - .../embedded_git/hooks/pre-applypatch.sample | 14 -- .../embedded_git/hooks/pre-commit.sample | 49 ----- .../hooks/pre-merge-commit.sample | 13 -- .../embedded_git/hooks/pre-push.sample | 53 ------ .../embedded_git/hooks/pre-rebase.sample | 169 ----------------- .../embedded_git/hooks/pre-receive.sample | 24 --- .../hooks/prepare-commit-msg.sample | 42 ----- .../hooks/push-to-checkout.sample | 78 -------- .../hooks/sendemail-validate.sample | 77 -------- .../embedded_git/hooks/update.sample | 128 ------------- test/data/status_data/embedded_git/index | Bin 294 -> 0 bytes .../status_data/embedded_git/info/exclude | 6 - test/data/status_data/embedded_git/logs/HEAD | 18 -- .../logs/refs/heads/commit_test_branch | 1 - .../embedded_git/logs/refs/heads/main | 2 - .../75/743dcbd85064226c77a0b862af817838ae0b2e | Bin 132 -> 0 bytes .../9c/a9a8716bf7f5ab1ff449be0c97a04a7aae4262 | Bin 38 -> 0 bytes .../a3/079a98067bc027a22dc56fe619c5d30f23d3a6 | Bin 129 -> 0 bytes .../bd/ef436c07ee899d19659581d2944f573ac620e0 | Bin 45 -> 0 bytes .../cb/a545ef5cc4ddf12a9744b6a49b20dda1ef1d5c | Bin 175 -> 0 bytes .../dc/430e3c2e6e1193b377040126b95099261e7251 | Bin 38 -> 0 bytes .../e3/323b422ccebe9515b4aa335b40615f398b6553 | Bin 121 -> 0 bytes .../ee/8c4cf874c4f1e3ba755f929fe7811018adee3d | 2 - .../fd/511fbb5dd2860baabf28e298fa3373634e8660 | Bin 89 -> 0 bytes .../refs/heads/commit_test_branch | 1 - .../status_data/embedded_git/refs/heads/main | 1 - test/data/status_data/last_test_file.txt | 1 - test/data/status_data/other_test_file.txt | 1 - test/data/status_data/random_file.txt | 1 - test/data/status_data/test_file.txt | 1 - test/test_add.py | 20 +- test/test_branch.py | 28 +-- test/test_checkout.py | 35 ++-- test/test_clone.py | 2 +- test/test_commit.py | 26 +-- test/test_status.py | 53 ++++-- 46 files changed, 111 insertions(+), 981 deletions(-) delete mode 100644 test/data/status_data/embedded_git/COMMIT_EDITMSG delete mode 100644 test/data/status_data/embedded_git/HEAD delete mode 100755 test/data/status_data/embedded_git/config delete mode 100644 test/data/status_data/embedded_git/description delete mode 100755 test/data/status_data/embedded_git/hooks/applypatch-msg.sample delete mode 100755 test/data/status_data/embedded_git/hooks/commit-msg.sample delete mode 100755 test/data/status_data/embedded_git/hooks/fsmonitor-watchman.sample delete mode 100755 test/data/status_data/embedded_git/hooks/post-update.sample delete mode 100755 test/data/status_data/embedded_git/hooks/pre-applypatch.sample delete mode 100755 test/data/status_data/embedded_git/hooks/pre-commit.sample delete mode 100755 test/data/status_data/embedded_git/hooks/pre-merge-commit.sample delete mode 100755 test/data/status_data/embedded_git/hooks/pre-push.sample delete mode 100755 test/data/status_data/embedded_git/hooks/pre-rebase.sample delete mode 100755 test/data/status_data/embedded_git/hooks/pre-receive.sample delete mode 100755 test/data/status_data/embedded_git/hooks/prepare-commit-msg.sample delete mode 100755 test/data/status_data/embedded_git/hooks/push-to-checkout.sample delete mode 100755 test/data/status_data/embedded_git/hooks/sendemail-validate.sample delete mode 100755 test/data/status_data/embedded_git/hooks/update.sample delete mode 100644 test/data/status_data/embedded_git/index delete mode 100644 test/data/status_data/embedded_git/info/exclude delete mode 100644 test/data/status_data/embedded_git/logs/HEAD delete mode 100644 test/data/status_data/embedded_git/logs/refs/heads/commit_test_branch delete mode 100644 test/data/status_data/embedded_git/logs/refs/heads/main delete mode 100644 test/data/status_data/embedded_git/objects/75/743dcbd85064226c77a0b862af817838ae0b2e delete mode 100644 test/data/status_data/embedded_git/objects/9c/a9a8716bf7f5ab1ff449be0c97a04a7aae4262 delete mode 100644 test/data/status_data/embedded_git/objects/a3/079a98067bc027a22dc56fe619c5d30f23d3a6 delete mode 100644 test/data/status_data/embedded_git/objects/bd/ef436c07ee899d19659581d2944f573ac620e0 delete mode 100644 test/data/status_data/embedded_git/objects/cb/a545ef5cc4ddf12a9744b6a49b20dda1ef1d5c delete mode 100644 test/data/status_data/embedded_git/objects/dc/430e3c2e6e1193b377040126b95099261e7251 delete mode 100644 test/data/status_data/embedded_git/objects/e3/323b422ccebe9515b4aa335b40615f398b6553 delete mode 100644 test/data/status_data/embedded_git/objects/ee/8c4cf874c4f1e3ba755f929fe7811018adee3d delete mode 100644 test/data/status_data/embedded_git/objects/fd/511fbb5dd2860baabf28e298fa3373634e8660 delete mode 100644 test/data/status_data/embedded_git/refs/heads/commit_test_branch delete mode 100644 test/data/status_data/embedded_git/refs/heads/main delete mode 100644 test/data/status_data/last_test_file.txt delete mode 100644 test/data/status_data/other_test_file.txt delete mode 100644 test/data/status_data/random_file.txt delete mode 100644 test/data/status_data/test_file.txt diff --git a/src/subcommand/commit_subcommand.cpp b/src/subcommand/commit_subcommand.cpp index b476100..e70f424 100644 --- a/src/subcommand/commit_subcommand.cpp +++ b/src/subcommand/commit_subcommand.cpp @@ -1,7 +1,7 @@ #include #include -#include "commit_subcommand.hpp" +#include "../subcommand/commit_subcommand.hpp" #include "../wrapper/index_wrapper.hpp" #include "../wrapper/repository_wrapper.hpp" diff --git a/test/conftest.py b/test/conftest.py index 75c398e..1d8a0b3 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -1,6 +1,8 @@ import os from pathlib import Path import pytest +import subprocess + # Fixture to run test in current tmp_path @pytest.fixture @@ -15,7 +17,14 @@ def git2cpp_path(): return Path(__file__).parent.parent / 'build' / 'git2cpp' @pytest.fixture -def rename_git(): - os.rename("test/data/status_data/embedded_git/", "test/data/status_data/.git/") +def xtl_clone(git2cpp_path): + url = 'https://github.com/xtensor-stack/xtl.git' + clone_working_dir = 'test/data' + + clone_cmd = [git2cpp_path, 'clone', url] + subprocess.run(clone_cmd, capture_output=True, cwd = clone_working_dir, text=True) + yield - os.rename("test/data/status_data/.git/", "test/data/status_data/embedded_git/") + + cleanup_cmd = ['rm', '-rf', 'xtl'] + subprocess.run(cleanup_cmd, capture_output=True, cwd = clone_working_dir, text=True) diff --git a/test/data/status_data/embedded_git/COMMIT_EDITMSG b/test/data/status_data/embedded_git/COMMIT_EDITMSG deleted file mode 100644 index c133ee6..0000000 --- a/test/data/status_data/embedded_git/COMMIT_EDITMSG +++ /dev/null @@ -1 +0,0 @@ -Second commit diff --git a/test/data/status_data/embedded_git/HEAD b/test/data/status_data/embedded_git/HEAD deleted file mode 100644 index 990e32d..0000000 --- a/test/data/status_data/embedded_git/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/commit_test_branch diff --git a/test/data/status_data/embedded_git/config b/test/data/status_data/embedded_git/config deleted file mode 100755 index 515f483..0000000 --- a/test/data/status_data/embedded_git/config +++ /dev/null @@ -1,5 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true diff --git a/test/data/status_data/embedded_git/description b/test/data/status_data/embedded_git/description deleted file mode 100644 index 498b267..0000000 --- a/test/data/status_data/embedded_git/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/data/status_data/embedded_git/hooks/applypatch-msg.sample b/test/data/status_data/embedded_git/hooks/applypatch-msg.sample deleted file mode 100755 index 09b38a8..0000000 --- a/test/data/status_data/embedded_git/hooks/applypatch-msg.sample +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/sh -# -# An example hook script to check the commit log message taken by -# applypatch from an e-mail message. -# -# The hook should exit with non-zero status after issuing an -# appropriate message if it wants to stop the commit. The hook is -# allowed to edit the commit message file. -# -# To enable this hook, rename this file to "applypatch-msg". - -. git-sh-setup -commitmsg="$(git rev-parse --git-path hooks/commit-msg)" -test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} -: diff --git a/test/data/status_data/embedded_git/hooks/commit-msg.sample b/test/data/status_data/embedded_git/hooks/commit-msg.sample deleted file mode 100755 index 3ced146..0000000 --- a/test/data/status_data/embedded_git/hooks/commit-msg.sample +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/sh -# -# An example hook script to check the commit log message. -# Called by "git commit" with one argument, the name of the file -# that has the commit message. The hook should exit with non-zero -# status after issuing an appropriate message if it wants to stop the -# commit. The hook is allowed to edit the commit message file. -# -# To enable this hook, rename this file to "commit-msg". - -# Uncomment the below to add a Signed-off-by line to the message. -# Doing this in a hook is a bad idea in general, but the prepare-commit-msg -# hook is more suited to it. -# -# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') -# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" - -# This example catches duplicate Signed-off-by lines. - -test "" = "$(grep '^Signed-off-by: ' "$1" | - sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { - echo >&2 Duplicate Signed-off-by lines. - exit 1 -} diff --git a/test/data/status_data/embedded_git/hooks/fsmonitor-watchman.sample b/test/data/status_data/embedded_git/hooks/fsmonitor-watchman.sample deleted file mode 100755 index 23e856f..0000000 --- a/test/data/status_data/embedded_git/hooks/fsmonitor-watchman.sample +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use IPC::Open2; - -# An example hook script to integrate Watchman -# (https://facebook.github.io/watchman/) with git to speed up detecting -# new and modified files. -# -# The hook is passed a version (currently 2) and last update token -# formatted as a string and outputs to stdout a new update token and -# all files that have been modified since the update token. Paths must -# be relative to the root of the working tree and separated by a single NUL. -# -# To enable this hook, rename this file to "query-watchman" and set -# 'git config core.fsmonitor .git/hooks/query-watchman' -# -my ($version, $last_update_token) = @ARGV; - -# Uncomment for debugging -# print STDERR "$0 $version $last_update_token\n"; - -# Check the hook interface version -if ($version ne 2) { - die "Unsupported query-fsmonitor hook version '$version'.\n" . - "Falling back to scanning...\n"; -} - -my $git_work_tree = get_working_dir(); - -my $retry = 1; - -my $json_pkg; -eval { - require JSON::XS; - $json_pkg = "JSON::XS"; - 1; -} or do { - require JSON::PP; - $json_pkg = "JSON::PP"; -}; - -launch_watchman(); - -sub launch_watchman { - my $o = watchman_query(); - if (is_work_tree_watched($o)) { - output_result($o->{clock}, @{$o->{files}}); - } -} - -sub output_result { - my ($clockid, @files) = @_; - - # Uncomment for debugging watchman output - # open (my $fh, ">", ".git/watchman-output.out"); - # binmode $fh, ":utf8"; - # print $fh "$clockid\n@files\n"; - # close $fh; - - binmode STDOUT, ":utf8"; - print $clockid; - print "\0"; - local $, = "\0"; - print @files; -} - -sub watchman_clock { - my $response = qx/watchman clock "$git_work_tree"/; - die "Failed to get clock id on '$git_work_tree'.\n" . - "Falling back to scanning...\n" if $? != 0; - - return $json_pkg->new->utf8->decode($response); -} - -sub watchman_query { - my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') - or die "open2() failed: $!\n" . - "Falling back to scanning...\n"; - - # In the query expression below we're asking for names of files that - # changed since $last_update_token but not from the .git folder. - # - # To accomplish this, we're using the "since" generator to use the - # recency index to select candidate nodes and "fields" to limit the - # output to file names only. Then we're using the "expression" term to - # further constrain the results. - my $last_update_line = ""; - if (substr($last_update_token, 0, 1) eq "c") { - $last_update_token = "\"$last_update_token\""; - $last_update_line = qq[\n"since": $last_update_token,]; - } - my $query = <<" END"; - ["query", "$git_work_tree", {$last_update_line - "fields": ["name"], - "expression": ["not", ["dirname", ".git"]] - }] - END - - # Uncomment for debugging the watchman query - # open (my $fh, ">", ".git/watchman-query.json"); - # print $fh $query; - # close $fh; - - print CHLD_IN $query; - close CHLD_IN; - my $response = do {local $/; }; - - # Uncomment for debugging the watch response - # open ($fh, ">", ".git/watchman-response.json"); - # print $fh $response; - # close $fh; - - die "Watchman: command returned no output.\n" . - "Falling back to scanning...\n" if $response eq ""; - die "Watchman: command returned invalid output: $response\n" . - "Falling back to scanning...\n" unless $response =~ /^\{/; - - return $json_pkg->new->utf8->decode($response); -} - -sub is_work_tree_watched { - my ($output) = @_; - my $error = $output->{error}; - if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { - $retry--; - my $response = qx/watchman watch "$git_work_tree"/; - die "Failed to make watchman watch '$git_work_tree'.\n" . - "Falling back to scanning...\n" if $? != 0; - $output = $json_pkg->new->utf8->decode($response); - $error = $output->{error}; - die "Watchman: $error.\n" . - "Falling back to scanning...\n" if $error; - - # Uncomment for debugging watchman output - # open (my $fh, ">", ".git/watchman-output.out"); - # close $fh; - - # Watchman will always return all files on the first query so - # return the fast "everything is dirty" flag to git and do the - # Watchman query just to get it over with now so we won't pay - # the cost in git to look up each individual file. - my $o = watchman_clock(); - $error = $output->{error}; - - die "Watchman: $error.\n" . - "Falling back to scanning...\n" if $error; - - output_result($o->{clock}, ("/")); - $last_update_token = $o->{clock}; - - eval { launch_watchman() }; - return 0; - } - - die "Watchman: $error.\n" . - "Falling back to scanning...\n" if $error; - - return 1; -} - -sub get_working_dir { - my $working_dir; - if ($^O =~ 'msys' || $^O =~ 'cygwin') { - $working_dir = Win32::GetCwd(); - $working_dir =~ tr/\\/\//; - } else { - require Cwd; - $working_dir = Cwd::cwd(); - } - - return $working_dir; -} diff --git a/test/data/status_data/embedded_git/hooks/post-update.sample b/test/data/status_data/embedded_git/hooks/post-update.sample deleted file mode 100755 index ee496e3..0000000 --- a/test/data/status_data/embedded_git/hooks/post-update.sample +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/sh -# -# An example hook script to prepare a packed repository for use over -# dumb transports. -# -# To enable this hook, rename this file to "post-update". - -exec git update-server-info diff --git a/test/data/status_data/embedded_git/hooks/pre-applypatch.sample b/test/data/status_data/embedded_git/hooks/pre-applypatch.sample deleted file mode 100755 index 845130a..0000000 --- a/test/data/status_data/embedded_git/hooks/pre-applypatch.sample +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/sh -# -# An example hook script to verify what is about to be committed -# by applypatch from an e-mail message. -# -# The hook should exit with non-zero status after issuing an -# appropriate message if it wants to stop the commit. -# -# To enable this hook, rename this file to "pre-applypatch". - -. git-sh-setup -precommit="$(git rev-parse --git-path hooks/pre-commit)" -test -x "$precommit" && exec "$precommit" ${1+"$@"} -: diff --git a/test/data/status_data/embedded_git/hooks/pre-commit.sample b/test/data/status_data/embedded_git/hooks/pre-commit.sample deleted file mode 100755 index 44f7de3..0000000 --- a/test/data/status_data/embedded_git/hooks/pre-commit.sample +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/sh -# -# An example hook script to verify what is about to be committed. -# Called by "git commit" with no arguments. The hook should -# exit with non-zero status after issuing an appropriate message if -# it wants to stop the commit. -# -# To enable this hook, rename this file to "pre-commit". - -if git rev-parse --verify HEAD >/dev/null 2>&1 -then - against=HEAD -else - # Initial commit: diff against an empty tree object - against=$(git hash-object -t tree /dev/null) -fi - -# If you want to allow non-ASCII filenames set this variable to true. -allownonascii=$(git config --type=bool hooks.allownonascii) - -# Redirect output to stderr. -exec 1>&2 - -# Cross platform projects tend to avoid non-ASCII filenames; prevent -# them from being added to the repository. We exploit the fact that the -# printable range starts at the space character and ends with tilde. -if [ "$allownonascii" != "true" ] && - # Note that the use of brackets around a tr range is ok here, (it's - # even required, for portability to Solaris 10's /usr/bin/tr), since - # the square bracket bytes happen to fall in the designated range. - test $(git diff-index --cached --name-only --diff-filter=A -z $against | - LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 -then - cat <<\EOF -Error: Attempt to add a non-ASCII file name. - -This can cause problems if you want to work with people on other platforms. - -To be portable it is advisable to rename the file. - -If you know what you are doing you can disable this check using: - - git config hooks.allownonascii true -EOF - exit 1 -fi - -# If there are whitespace errors, print the offending file names and fail. -exec git diff-index --check --cached $against -- diff --git a/test/data/status_data/embedded_git/hooks/pre-merge-commit.sample b/test/data/status_data/embedded_git/hooks/pre-merge-commit.sample deleted file mode 100755 index 09b65a5..0000000 --- a/test/data/status_data/embedded_git/hooks/pre-merge-commit.sample +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/sh -# -# An example hook script to verify what is about to be committed. -# Called by "git merge" with no arguments. The hook should -# exit with non-zero status after issuing an appropriate message to -# stderr if it wants to stop the merge commit. -# -# To enable this hook, rename this file to "pre-merge-commit". - -. git-sh-setup -test -x "$GIT_DIR/hooks/pre-commit" && - exec "$GIT_DIR/hooks/pre-commit" -: diff --git a/test/data/status_data/embedded_git/hooks/pre-push.sample b/test/data/status_data/embedded_git/hooks/pre-push.sample deleted file mode 100755 index d5e513d..0000000 --- a/test/data/status_data/embedded_git/hooks/pre-push.sample +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/sh - -# An example hook script to verify what is about to be pushed. Called by "git -# push" after it has checked the remote status, but before anything has been -# pushed. If this script exits with a non-zero status nothing will be pushed. -# -# This hook is called with the following parameters: -# -# $1 -- Name of the remote to which the push is being done -# $2 -- URL to which the push is being done -# -# If pushing without using a named remote those arguments will be equal. -# -# Information about the commits which are being pushed is supplied as lines to -# the standard input in the form: -# -# -# -# This sample shows how to prevent push of commits where the log message starts -# with "WIP" (work in progress). - -remote="$1" -url="$2" - -zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" - exit 1 - fi - fi -done - -exit 0 diff --git a/test/data/status_data/embedded_git/hooks/pre-rebase.sample b/test/data/status_data/embedded_git/hooks/pre-rebase.sample deleted file mode 100755 index 36efc64..0000000 --- a/test/data/status_data/embedded_git/hooks/pre-rebase.sample +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/sh -# -# Copyright (c) 2006, 2008 Junio C Hamano -# -# The "pre-rebase" hook is run just before "git rebase" starts doing -# its job, and can prevent the command from running by exiting with -# non-zero status. -# -# The hook is called with the following parameters: -# -# $1 -- the upstream the series was forked from. -# $2 -- the branch being rebased (or empty when rebasing the current branch). -# -# This sample shows how to prevent topic branches that are already -# merged to 'next' branch from getting rebased, because allowing it -# would result in rebasing already published history. - -publish=next -basebranch="$1" -if test "$#" = 2 -then - topic="refs/heads/$2" -else - topic=`git symbolic-ref HEAD` || - exit 0 ;# we do not interrupt rebasing detached HEAD -fi - -case "$topic" in -refs/heads/??/*) - ;; -*) - exit 0 ;# we do not interrupt others. - ;; -esac - -# Now we are dealing with a topic branch being rebased -# on top of master. Is it OK to rebase it? - -# Does the topic really exist? -git show-ref -q "$topic" || { - echo >&2 "No such branch $topic" - exit 1 -} - -# Is topic fully merged to master? -not_in_master=`git rev-list --pretty=oneline ^master "$topic"` -if test -z "$not_in_master" -then - echo >&2 "$topic is fully merged to master; better remove it." - exit 1 ;# we could allow it, but there is no point. -fi - -# Is topic ever merged to next? If so you should not be rebasing it. -only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` -only_next_2=`git rev-list ^master ${publish} | sort` -if test "$only_next_1" = "$only_next_2" -then - not_in_topic=`git rev-list "^$topic" master` - if test -z "$not_in_topic" - then - echo >&2 "$topic is already up to date with master" - exit 1 ;# we could allow it, but there is no point. - else - exit 0 - fi -else - not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` - /usr/bin/perl -e ' - my $topic = $ARGV[0]; - my $msg = "* $topic has commits already merged to public branch:\n"; - my (%not_in_next) = map { - /^([0-9a-f]+) /; - ($1 => 1); - } split(/\n/, $ARGV[1]); - for my $elem (map { - /^([0-9a-f]+) (.*)$/; - [$1 => $2]; - } split(/\n/, $ARGV[2])) { - if (!exists $not_in_next{$elem->[0]}) { - if ($msg) { - print STDERR $msg; - undef $msg; - } - print STDERR " $elem->[1]\n"; - } - } - ' "$topic" "$not_in_next" "$not_in_master" - exit 1 -fi - -<<\DOC_END - -This sample hook safeguards topic branches that have been -published from being rewound. - -The workflow assumed here is: - - * Once a topic branch forks from "master", "master" is never - merged into it again (either directly or indirectly). - - * Once a topic branch is fully cooked and merged into "master", - it is deleted. If you need to build on top of it to correct - earlier mistakes, a new topic branch is created by forking at - the tip of the "master". This is not strictly necessary, but - it makes it easier to keep your history simple. - - * Whenever you need to test or publish your changes to topic - branches, merge them into "next" branch. - -The script, being an example, hardcodes the publish branch name -to be "next", but it is trivial to make it configurable via -$GIT_DIR/config mechanism. - -With this workflow, you would want to know: - -(1) ... if a topic branch has ever been merged to "next". Young - topic branches can have stupid mistakes you would rather - clean up before publishing, and things that have not been - merged into other branches can be easily rebased without - affecting other people. But once it is published, you would - not want to rewind it. - -(2) ... if a topic branch has been fully merged to "master". - Then you can delete it. More importantly, you should not - build on top of it -- other people may already want to - change things related to the topic as patches against your - "master", so if you need further changes, it is better to - fork the topic (perhaps with the same name) afresh from the - tip of "master". - -Let's look at this example: - - o---o---o---o---o---o---o---o---o---o "next" - / / / / - / a---a---b A / / - / / / / - / / c---c---c---c B / - / / / \ / - / / / b---b C \ / - / / / / \ / - ---o---o---o---o---o---o---o---o---o---o---o "master" - - -A, B and C are topic branches. - - * A has one fix since it was merged up to "next". - - * B has finished. It has been fully merged up to "master" and "next", - and is ready to be deleted. - - * C has not merged to "next" at all. - -We would want to allow C to be rebased, refuse A, and encourage -B to be deleted. - -To compute (1): - - git rev-list ^master ^topic next - git rev-list ^master next - - if these match, topic has not merged in next at all. - -To compute (2): - - git rev-list master..topic - - if this is empty, it is fully merged to "master". - -DOC_END diff --git a/test/data/status_data/embedded_git/hooks/pre-receive.sample b/test/data/status_data/embedded_git/hooks/pre-receive.sample deleted file mode 100755 index 6f473c3..0000000 --- a/test/data/status_data/embedded_git/hooks/pre-receive.sample +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/sh -# -# An example hook script to make use of push options. -# The example simply echoes all push options that start with 'echoback=' -# and rejects all pushes when the "reject" push option is used. -# -# To enable this hook, rename this file to "pre-receive". - -if test -n "$GIT_PUSH_OPTION_COUNT" -then - i=0 - while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" - do - eval "value=\$GIT_PUSH_OPTION_$i" - case "$value" in - echoback=*) - echo "echo from the pre-receive-hook: ${value#*=}" >&2 - ;; - reject) - exit 1 - esac - i=$((i + 1)) - done -fi diff --git a/test/data/status_data/embedded_git/hooks/prepare-commit-msg.sample b/test/data/status_data/embedded_git/hooks/prepare-commit-msg.sample deleted file mode 100755 index cd8e794..0000000 --- a/test/data/status_data/embedded_git/hooks/prepare-commit-msg.sample +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/sh -# -# An example hook script to prepare the commit log message. -# Called by "git commit" with the name of the file that has the -# commit message, followed by the description of the commit -# message's source. The hook's purpose is to edit the commit -# message file. If the hook fails with a non-zero status, -# the commit is aborted. -# -# To enable this hook, rename this file to "prepare-commit-msg". - -# This hook includes three examples. The first one removes the -# "# Please enter the commit message..." help message. -# -# The second includes the output of "git diff --name-status -r" -# into the message, just before the "git status" output. It is -# commented because it doesn't cope with --amend or with squashed -# commits. -# -# The third example adds a Signed-off-by line to the message, that can -# still be edited. This is rarely a good idea. - -COMMIT_MSG_FILE=$1 -COMMIT_SOURCE=$2 -SHA1=$3 - -/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" - -# case "$COMMIT_SOURCE,$SHA1" in -# ,|template,) -# /usr/bin/perl -i.bak -pe ' -# print "\n" . `git diff --cached --name-status -r` -# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; -# *) ;; -# esac - -# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') -# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" -# if test -z "$COMMIT_SOURCE" -# then -# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" -# fi diff --git a/test/data/status_data/embedded_git/hooks/push-to-checkout.sample b/test/data/status_data/embedded_git/hooks/push-to-checkout.sample deleted file mode 100755 index badb4b4..0000000 --- a/test/data/status_data/embedded_git/hooks/push-to-checkout.sample +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/sh - -# An example hook script to update a checked-out tree on a git push. -# -# This hook is invoked by git-receive-pack(1) when it reacts to git -# push and updates reference(s) in its repository, and when the push -# tries to update the branch that is currently checked out and the -# receive.denyCurrentBranch configuration variable is set to -# updateInstead. -# -# By default, such a push is refused if the working tree and the index -# of the remote repository has any difference from the currently -# checked out commit; when both the working tree and the index match -# the current commit, they are updated to match the newly pushed tip -# of the branch. This hook is to be used to override the default -# behaviour; however the code below reimplements the default behaviour -# as a starting point for convenient modification. -# -# The hook receives the commit with which the tip of the current -# branch is going to be updated: -commit=$1 - -# It can exit with a non-zero status to refuse the push (when it does -# so, it must not modify the index or the working tree). -die () { - echo >&2 "$*" - exit 1 -} - -# Or it can make any necessary changes to the working tree and to the -# index to bring them to the desired state when the tip of the current -# branch is updated to the new commit, and exit with a zero status. -# -# For example, the hook can simply run git read-tree -u -m HEAD "$1" -# in order to emulate git fetch that is run in the reverse direction -# with git push, as the two-tree form of git read-tree -u -m is -# essentially the same as git switch or git checkout that switches -# branches while keeping the local changes in the working tree that do -# not interfere with the difference between the branches. - -# The below is a more-or-less exact translation to shell of the C code -# for the default behaviour for git's push-to-checkout hook defined in -# the push_to_deploy() function in builtin/receive-pack.c. -# -# Note that the hook will be executed from the repository directory, -# not from the working tree, so if you want to perform operations on -# the working tree, you will have to adapt your code accordingly, e.g. -# by adding "cd .." or using relative paths. - -if ! git update-index -q --ignore-submodules --refresh -then - die "Up-to-date check failed" -fi - -if ! git diff-files --quiet --ignore-submodules -- -then - die "Working directory has unstaged changes" -fi - -# This is a rough translation of: -# -# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX -if git cat-file -e HEAD 2>/dev/null -then - head=HEAD -else - head=$(git hash-object -t tree --stdin &2 - exit 1 -} - -unset GIT_DIR GIT_WORK_TREE -cd "$worktree" && - -if grep -q "^diff --git " "$1" -then - validate_patch "$1" -else - validate_cover_letter "$1" -fi && - -if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" -then - git config --unset-all sendemail.validateWorktree && - trap 'git worktree remove -ff "$worktree"' EXIT && - validate_series -fi diff --git a/test/data/status_data/embedded_git/hooks/update.sample b/test/data/status_data/embedded_git/hooks/update.sample deleted file mode 100755 index 5503c12..0000000 --- a/test/data/status_data/embedded_git/hooks/update.sample +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/sh -# -# An example hook script to block unannotated tags from entering. -# Called by "git receive-pack" with arguments: refname sha1-old sha1-new -# -# To enable this hook, rename this file to "update". -# -# Config -# ------ -# hooks.allowunannotated -# This boolean sets whether unannotated tags will be allowed into the -# repository. By default they won't be. -# hooks.allowdeletetag -# This boolean sets whether deleting tags will be allowed in the -# repository. By default they won't be. -# hooks.allowmodifytag -# This boolean sets whether a tag may be modified after creation. By default -# it won't be. -# hooks.allowdeletebranch -# This boolean sets whether deleting branches will be allowed in the -# repository. By default they won't be. -# hooks.denycreatebranch -# This boolean sets whether remotely creating branches will be denied -# in the repository. By default this is allowed. -# - -# --- Command line -refname="$1" -oldrev="$2" -newrev="$3" - -# --- Safety check -if [ -z "$GIT_DIR" ]; then - echo "Don't run this script from the command line." >&2 - echo " (if you want, you could supply GIT_DIR then run" >&2 - echo " $0 )" >&2 - exit 1 -fi - -if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then - echo "usage: $0 " >&2 - exit 1 -fi - -# --- Config -allowunannotated=$(git config --type=bool hooks.allowunannotated) -allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) -denycreatebranch=$(git config --type=bool hooks.denycreatebranch) -allowdeletetag=$(git config --type=bool hooks.allowdeletetag) -allowmodifytag=$(git config --type=bool hooks.allowmodifytag) - -# check for no description -projectdesc=$(sed -e '1q' "$GIT_DIR/description") -case "$projectdesc" in -"Unnamed repository"* | "") - echo "*** Project description file hasn't been set" >&2 - exit 1 - ;; -esac - -# --- Check types -# if $newrev is 0000...0000, it's a commit to delete a ref. -zero=$(git hash-object --stdin &2 - echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 - exit 1 - fi - ;; - refs/tags/*,delete) - # delete tag - if [ "$allowdeletetag" != "true" ]; then - echo "*** Deleting a tag is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/tags/*,tag) - # annotated tag - if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 - then - echo "*** Tag '$refname' already exists." >&2 - echo "*** Modifying a tag is not allowed in this repository." >&2 - exit 1 - fi - ;; - refs/heads/*,commit) - # branch - if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then - echo "*** Creating a branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/heads/*,delete) - # delete branch - if [ "$allowdeletebranch" != "true" ]; then - echo "*** Deleting a branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/remotes/*,commit) - # tracking branch - ;; - refs/remotes/*,delete) - # delete tracking branch - if [ "$allowdeletebranch" != "true" ]; then - echo "*** Deleting a tracking branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - *) - # Anything else (is there anything else?) - echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 - exit 1 - ;; -esac - -# --- Finished -exit 0 diff --git a/test/data/status_data/embedded_git/index b/test/data/status_data/embedded_git/index deleted file mode 100644 index 95e66756d042e8caa34a150d0f4b443a8426c817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmZ?q402{*U|<4b=8P_5LH$EMvtTq(jDf*v`%4Cf#w9@M7ZA)KHfQCE!tC!~SId9# z+{ZJ0fmhW!rz8g9{F02+qWF^3;*$8Z%$!ucl8O?r0SpWoU1rbp^k*@_Xo$JH4xyWS z$C=MYFHdmt=5iKBwVeSo)#Qo-8TgA5^HTD2k 1750769952 +0200 commit (initial): first commit -75743dcbd85064226c77a0b862af817838ae0b2e ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1750771272 +0200 commit: Second commit -ee8c4cf874c4f1e3ba755f929fe7811018adee3d ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753887403 +0200 checkout: moving from main to bla -ee8c4cf874c4f1e3ba755f929fe7811018adee3d ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753887403 +0200 checkout: moving from bla to main -ee8c4cf874c4f1e3ba755f929fe7811018adee3d ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753887403 +0200 checkout: moving from main to bla -ee8c4cf874c4f1e3ba755f929fe7811018adee3d ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753887403 +0200 checkout: moving from bla to main -ee8c4cf874c4f1e3ba755f929fe7811018adee3d ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753887403 +0200 checkout: moving from main to bla -ee8c4cf874c4f1e3ba755f929fe7811018adee3d ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753887403 +0200 checkout: moving from bla to main -ee8c4cf874c4f1e3ba755f929fe7811018adee3d ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753887403 +0200 checkout: moving from main to bla -ee8c4cf874c4f1e3ba755f929fe7811018adee3d ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753887403 +0200 checkout: moving from bla to main -ee8c4cf874c4f1e3ba755f929fe7811018adee3d ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753887505 +0200 checkout: moving from main to commit_test_branch -ee8c4cf874c4f1e3ba755f929fe7811018adee3d cba545ef5cc4ddf12a9744b6a49b20dda1ef1d5c Sandrine Pataut 1753887505 +0200 commit: test commit -cba545ef5cc4ddf12a9744b6a49b20dda1ef1d5c ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753887505 +0200 reset: moving to ee8c4cf874c4f1e3ba755f929fe7811018adee3d -ee8c4cf874c4f1e3ba755f929fe7811018adee3d ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753887505 +0200 checkout: moving from commit_test_branch to main -ee8c4cf874c4f1e3ba755f929fe7811018adee3d ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753887505 +0200 checkout: moving from main to commit_test_branch -ee8c4cf874c4f1e3ba755f929fe7811018adee3d 75743dcbd85064226c77a0b862af817838ae0b2e Sandrine Pataut 1753888486 +0200 reset: moving to 75743dcbd85064226c77a0b862af817838ae0b2e -75743dcbd85064226c77a0b862af817838ae0b2e ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753888486 +0200 checkout: moving from commit_test_branch to main -ee8c4cf874c4f1e3ba755f929fe7811018adee3d ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753888486 +0200 checkout: moving from main to commit_test_branch diff --git a/test/data/status_data/embedded_git/logs/refs/heads/commit_test_branch b/test/data/status_data/embedded_git/logs/refs/heads/commit_test_branch deleted file mode 100644 index 0d35c1b..0000000 --- a/test/data/status_data/embedded_git/logs/refs/heads/commit_test_branch +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000 ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1753888486 +0200 branch: Created from ee8c4cf874c4f1e3ba755f929fe7811018adee3d diff --git a/test/data/status_data/embedded_git/logs/refs/heads/main b/test/data/status_data/embedded_git/logs/refs/heads/main deleted file mode 100644 index a996210..0000000 --- a/test/data/status_data/embedded_git/logs/refs/heads/main +++ /dev/null @@ -1,2 +0,0 @@ -0000000000000000000000000000000000000000 75743dcbd85064226c77a0b862af817838ae0b2e Sandrine Pataut 1750769952 +0200 commit (initial): first commit -75743dcbd85064226c77a0b862af817838ae0b2e ee8c4cf874c4f1e3ba755f929fe7811018adee3d Sandrine Pataut 1750771272 +0200 commit: Second commit diff --git a/test/data/status_data/embedded_git/objects/75/743dcbd85064226c77a0b862af817838ae0b2e b/test/data/status_data/embedded_git/objects/75/743dcbd85064226c77a0b862af817838ae0b2e deleted file mode 100644 index fbfd68ec05d063ed93b33efe96ff37fbb5e8784d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmV-~0DJ#<0i}&e3IZ_@06pgweHVr-W&;tQAozk#($RpKkxbA3h0z~)DyTzMUV3i~ zD#im3BB;eGRa3I1=-^~ROjQTcF;q0h8)r@woRb1Kel7#J|5ODXa`XZkZEY8xxVw7Hf1n0FfcPQQOGaJNG*ylNi8mkPs_|njn7Lh*DI+gVVJXW zMPc^$udC(1c<$qwzQC($ol_E2OHpE8N`5X_Iaui(XFeOfJi*DE%UKxJb_UE;lPd~@ jDutU1R=D@Qa}N8v&bgAQQyVW$@ej8;rtkm&{mnMHv`;zj diff --git a/test/data/status_data/embedded_git/objects/bd/ef436c07ee899d19659581d2944f573ac620e0 b/test/data/status_data/embedded_git/objects/bd/ef436c07ee899d19659581d2944f573ac620e0 deleted file mode 100644 index 0d7359169376ffdedc5e8554179ea6105275ddbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45 zcmb~$>tA4tgHp~0OMq$3vO1{cz+l5238+D#mmRz zF!T+K$3>e&fGmbYDWVS-Mia=G%+43_Id6 diff --git a/test/data/status_data/embedded_git/objects/dc/430e3c2e6e1193b377040126b95099261e7251 b/test/data/status_data/embedded_git/objects/dc/430e3c2e6e1193b377040126b95099261e7251 deleted file mode 100644 index fd8249d65fc0856ff2f51818d9f40eadce1d18e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38 ucmb7He@g~FfcPQQOGaJNG*ylNi8mkPs_|n)hnqeVVJXWMPc^$ zudC(1c<$qwzQC($ol_E2c~N3sN`5Xv=^bZ28@)Wi$(zer7}a(L%v6&r3WO>}HFNKK b=N$HTopU8qr#4=i;va5xOyL0l8rd}r|En|k diff --git a/test/data/status_data/embedded_git/objects/ee/8c4cf874c4f1e3ba755f929fe7811018adee3d b/test/data/status_data/embedded_git/objects/ee/8c4cf874c4f1e3ba755f929fe7811018adee3d deleted file mode 100644 index ce96d7b..0000000 --- a/test/data/status_data/embedded_git/objects/ee/8c4cf874c4f1e3ba755f929fe7811018adee3d +++ /dev/null @@ -1,2 +0,0 @@ -xK -1 @] &M xX/7p-.46wm3#B*V+qUD咘ɭ@X"}/99H W/\uq6hWۤPA؋G]63VoνOu \ No newline at end of file diff --git a/test/data/status_data/embedded_git/objects/fd/511fbb5dd2860baabf28e298fa3373634e8660 b/test/data/status_data/embedded_git/objects/fd/511fbb5dd2860baabf28e298fa3373634e8660 deleted file mode 100644 index 476418f149af2f35d0c21cfe392c53b5a4718440..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmV-f0H*(V0V^p=O;xb4U@$Z=Ff%bx$S=uAEs8HmEiQ>q%gjmDE2$`9n6q+4VfOd0 vtL49V?&F!hz^iJVQxa4;s=~eRopadVb Date: Fri, 1 Aug 2025 11:52:08 +0200 Subject: [PATCH 02/12] add a blank file to commit the data folder --- test/data/blank_file.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/data/blank_file.txt diff --git a/test/data/blank_file.txt b/test/data/blank_file.txt new file mode 100644 index 0000000..e69de29 From 9951eba3b22668c5a2800c2a7fdec0235e44c113 Mon Sep 17 00:00:00 2001 From: Sandrine Pataut Date: Fri, 1 Aug 2025 14:07:43 +0200 Subject: [PATCH 03/12] remove reset from commit test --- test/test_commit.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/test_commit.py b/test/test_commit.py index ab7a390..72ce5f3 100644 --- a/test/test_commit.py +++ b/test/test_commit.py @@ -27,6 +27,3 @@ def test_commit(xtl_clone, git2cpp_path, all_flag): p_status_2 = subprocess.run(cmd_status_2, capture_output=True, cwd=working_dir, text=True) assert "mook_file" not in p_status_2.stdout - - cmd_reset = [git2cpp_path, 'reset', "--hard", "HEAD~1"] - subprocess.run(cmd_reset, cwd=working_dir, text=True) From 0a1396fd2932fa481b5763cc277ae1b4669d36c7 Mon Sep 17 00:00:00 2001 From: Sandrine Pataut Date: Fri, 1 Aug 2025 17:49:41 +0200 Subject: [PATCH 04/12] test with .gitconfig --- test/conftest.py | 9 +++++++++ test/test_commit.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/test/conftest.py b/test/conftest.py index 1d8a0b3..07c37e1 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -28,3 +28,12 @@ def xtl_clone(git2cpp_path): cleanup_cmd = ['rm', '-rf', 'xtl'] subprocess.run(cleanup_cmd, capture_output=True, cwd = clone_working_dir, text=True) + +@pytest.fixture +def git_config(git2cpp_path): + with open("test/data/.gitconfig", "a") as f: + f.write("[user]\n name = Jane Doe\n email = jane.doe@blabla.com") + + yield + + os.remove("test/data/.gitconfig") diff --git a/test/test_commit.py b/test/test_commit.py index 72ce5f3..1d32ce7 100644 --- a/test/test_commit.py +++ b/test/test_commit.py @@ -7,7 +7,7 @@ working_dir = 'test/data/xtl' @pytest.mark.parametrize("all_flag", ["", "-A", "--all", "--no-ignore-removal"]) -def test_commit(xtl_clone, git2cpp_path, all_flag): +def test_commit(xtl_clone, git_config, git2cpp_path, all_flag): with open("./test/data/xtl/mook_file.txt", "x"): pass From 242866efb2608be5a32bebe2bcf3c74665f443a0 Mon Sep 17 00:00:00 2001 From: Sandrine Pataut Date: Fri, 1 Aug 2025 18:04:12 +0200 Subject: [PATCH 05/12] edit conftest --- test/conftest.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/test/conftest.py b/test/conftest.py index 07c37e1..8b6077d 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -2,6 +2,7 @@ from pathlib import Path import pytest import subprocess +from genericpath import exists # Fixture to run test in current tmp_path @@ -31,9 +32,11 @@ def xtl_clone(git2cpp_path): @pytest.fixture def git_config(git2cpp_path): - with open("test/data/.gitconfig", "a") as f: - f.write("[user]\n name = Jane Doe\n email = jane.doe@blabla.com") + gitconfig_path = "~/.gitconfig" + if not(os.path.isfile(gitconfig_path)): + with open("~/.gitconfig", "a") as f: + f.write("[user]\n name = Jane Doe\n email = jane.doe@blabla.com") - yield + yield - os.remove("test/data/.gitconfig") + os.remove("test/data/.gitconfig") From b0183250e9978d15b5bdd803e024cf0f2fa899de Mon Sep 17 00:00:00 2001 From: Sandrine Pataut Date: Mon, 4 Aug 2025 11:30:02 +0200 Subject: [PATCH 06/12] use monkeypatch in conftest --- test/conftest.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/test/conftest.py b/test/conftest.py index 8b6077d..b8c6b35 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -31,12 +31,6 @@ def xtl_clone(git2cpp_path): subprocess.run(cleanup_cmd, capture_output=True, cwd = clone_working_dir, text=True) @pytest.fixture -def git_config(git2cpp_path): - gitconfig_path = "~/.gitconfig" - if not(os.path.isfile(gitconfig_path)): - with open("~/.gitconfig", "a") as f: - f.write("[user]\n name = Jane Doe\n email = jane.doe@blabla.com") - - yield - - os.remove("test/data/.gitconfig") +def git_config(git2cpp_path, monkeypatch): + monkeypatch.setenv("GIT_AUTHOR_NAME", "Jane Doe") + monkeypatch.setenv("GIT_AUTHOR_EMAIL", "jane.doe@blabla.com") From fb817461d3bcf1e33af391ad812521a1ae4ddc12 Mon Sep 17 00:00:00 2001 From: Sandrine Pataut Date: Mon, 4 Aug 2025 11:35:38 +0200 Subject: [PATCH 07/12] small fix --- test/test_commit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_commit.py b/test/test_commit.py index 1d32ce7..5d394b9 100644 --- a/test/test_commit.py +++ b/test/test_commit.py @@ -7,7 +7,7 @@ working_dir = 'test/data/xtl' @pytest.mark.parametrize("all_flag", ["", "-A", "--all", "--no-ignore-removal"]) -def test_commit(xtl_clone, git_config, git2cpp_path, all_flag): +def test_commit(xtl_clone, git_config, git2cpp_path, monkeypatch, all_flag): with open("./test/data/xtl/mook_file.txt", "x"): pass From 89162b528a324cf55277c5ca556ffe47362160b6 Mon Sep 17 00:00:00 2001 From: Sandrine Pataut Date: Mon, 4 Aug 2025 12:09:38 +0200 Subject: [PATCH 08/12] try with os --- test/conftest.py | 9 +++++++-- test/test_commit.py | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/test/conftest.py b/test/conftest.py index b8c6b35..9a98d5f 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -32,5 +32,10 @@ def xtl_clone(git2cpp_path): @pytest.fixture def git_config(git2cpp_path, monkeypatch): - monkeypatch.setenv("GIT_AUTHOR_NAME", "Jane Doe") - monkeypatch.setenv("GIT_AUTHOR_EMAIL", "jane.doe@blabla.com") + os.environ["GIT_AUTHOR_NAME"] = "Jane Doe" + os.environ["GIT_AUTHOR_EMAIL"] = "jane.doe@blabla.com" + + yield + + del(os.environ["GIT_AUTHOR_NAME"]) + del(os.environ["GIT_AUTHOR_EMAIL"]) diff --git a/test/test_commit.py b/test/test_commit.py index 5d394b9..1d32ce7 100644 --- a/test/test_commit.py +++ b/test/test_commit.py @@ -7,7 +7,7 @@ working_dir = 'test/data/xtl' @pytest.mark.parametrize("all_flag", ["", "-A", "--all", "--no-ignore-removal"]) -def test_commit(xtl_clone, git_config, git2cpp_path, monkeypatch, all_flag): +def test_commit(xtl_clone, git_config, git2cpp_path, all_flag): with open("./test/data/xtl/mook_file.txt", "x"): pass From f03ec2463c3120c93931d247e29b9512fb29dda3 Mon Sep 17 00:00:00 2001 From: Sandrine Pataut Date: Thu, 7 Aug 2025 11:21:09 +0200 Subject: [PATCH 09/12] new try with os --- test/conftest.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/conftest.py b/test/conftest.py index 9a98d5f..371e41c 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -31,11 +31,15 @@ def xtl_clone(git2cpp_path): subprocess.run(cleanup_cmd, capture_output=True, cwd = clone_working_dir, text=True) @pytest.fixture -def git_config(git2cpp_path, monkeypatch): +def git_config(git2cpp_path): os.environ["GIT_AUTHOR_NAME"] = "Jane Doe" os.environ["GIT_AUTHOR_EMAIL"] = "jane.doe@blabla.com" + os.environ["GIT_COMMITTER_NAME"] = "Jane Doe" + os.environ["GIT_COMMITTER_EMAIL"] = "jane.doe@blabla.com" yield del(os.environ["GIT_AUTHOR_NAME"]) del(os.environ["GIT_AUTHOR_EMAIL"]) + del(os.environ["GIT_COMMITTER_NAME"]) + del(os.environ["GIT_COMMITTER_EMAIL"]) From d2fd47524a900340aa2326a23f82f229dfd84767 Mon Sep 17 00:00:00 2001 From: Sandrine Pataut Date: Thu, 7 Aug 2025 11:26:47 +0200 Subject: [PATCH 10/12] try with monkeypatch and committer --- test/conftest.py | 15 +++------------ test/test_commit.py | 2 +- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/test/conftest.py b/test/conftest.py index 371e41c..76c2035 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -31,15 +31,6 @@ def xtl_clone(git2cpp_path): subprocess.run(cleanup_cmd, capture_output=True, cwd = clone_working_dir, text=True) @pytest.fixture -def git_config(git2cpp_path): - os.environ["GIT_AUTHOR_NAME"] = "Jane Doe" - os.environ["GIT_AUTHOR_EMAIL"] = "jane.doe@blabla.com" - os.environ["GIT_COMMITTER_NAME"] = "Jane Doe" - os.environ["GIT_COMMITTER_EMAIL"] = "jane.doe@blabla.com" - - yield - - del(os.environ["GIT_AUTHOR_NAME"]) - del(os.environ["GIT_AUTHOR_EMAIL"]) - del(os.environ["GIT_COMMITTER_NAME"]) - del(os.environ["GIT_COMMITTER_EMAIL"]) +def git_config(git2cpp_path, monkeypatch): + monkeypatch.setenv("GIT_COMMITTER_NAME", "Jane Doe") + monkeypatch.setenv("GIT_COMMITTER_EMAIL", "jane.doe@blabla.com") diff --git a/test/test_commit.py b/test/test_commit.py index 1d32ce7..5d394b9 100644 --- a/test/test_commit.py +++ b/test/test_commit.py @@ -7,7 +7,7 @@ working_dir = 'test/data/xtl' @pytest.mark.parametrize("all_flag", ["", "-A", "--all", "--no-ignore-removal"]) -def test_commit(xtl_clone, git_config, git2cpp_path, all_flag): +def test_commit(xtl_clone, git_config, git2cpp_path, monkeypatch, all_flag): with open("./test/data/xtl/mook_file.txt", "x"): pass From cccdc4c8ae8a7651ace8635976a89b30f595f4aa Mon Sep 17 00:00:00 2001 From: Sandrine Pataut Date: Thu, 7 Aug 2025 11:28:19 +0200 Subject: [PATCH 11/12] try with monkeypatch with author and committer --- test/conftest.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/conftest.py b/test/conftest.py index 76c2035..057f0bf 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -32,5 +32,7 @@ def xtl_clone(git2cpp_path): @pytest.fixture def git_config(git2cpp_path, monkeypatch): + monkeypatch.setenv("GIT_AUTHOR_NAME", "Jane Doe") + monkeypatch.setenv("GIT_AUTHOR_EMAIL", "jane.doe@blabla.com") monkeypatch.setenv("GIT_COMMITTER_NAME", "Jane Doe") monkeypatch.setenv("GIT_COMMITTER_EMAIL", "jane.doe@blabla.com") From 3248cd67962ecb5dcfca6dcc544f6e8856b78c35 Mon Sep 17 00:00:00 2001 From: Sandrine Pataut Date: Thu, 7 Aug 2025 12:35:31 +0200 Subject: [PATCH 12/12] address review comments --- test/conftest.py | 3 +-- test/test_branch.py | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/test/conftest.py b/test/conftest.py index 057f0bf..b84b04a 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -2,7 +2,6 @@ from pathlib import Path import pytest import subprocess -from genericpath import exists # Fixture to run test in current tmp_path @@ -31,7 +30,7 @@ def xtl_clone(git2cpp_path): subprocess.run(cleanup_cmd, capture_output=True, cwd = clone_working_dir, text=True) @pytest.fixture -def git_config(git2cpp_path, monkeypatch): +def git_config(monkeypatch): monkeypatch.setenv("GIT_AUTHOR_NAME", "Jane Doe") monkeypatch.setenv("GIT_AUTHOR_EMAIL", "jane.doe@blabla.com") monkeypatch.setenv("GIT_COMMITTER_NAME", "Jane Doe") diff --git a/test/test_branch.py b/test/test_branch.py index 5cb754c..a30ce51 100644 --- a/test/test_branch.py +++ b/test/test_branch.py @@ -9,7 +9,6 @@ def test_branch_list(xtl_clone, git2cpp_path): cmd = [git2cpp_path, 'branch'] p = subprocess.run(cmd, capture_output=True, cwd=working_dir, text=True) - print() assert(p.stdout == '* master\n')