summaryrefslogtreecommitdiff
path: root/IkiWiki/Rcs/svn.pm
diff options
context:
space:
mode:
authorJoey Hess <joey@kodama.kitenet.net>2008-07-22 16:14:33 -0400
committerJoey Hess <joey@kodama.kitenet.net>2008-07-22 16:14:33 -0400
commitcbddb5a4b8e0e2fb63886ad9d1cf8a087cdb83b1 (patch)
treefab8316d385e89d959189cc199e79457dcb90486 /IkiWiki/Rcs/svn.pm
parentcf9620074acb1309118f08094229ce21d7352ed0 (diff)
add rcs_commit_staged and rcs_rename
Implemented for git and svn so far. Note that rcs_commit_staged does assume that the rcs has the ability to "stage" multiple changes for a later commit. Support for this varies, but all we really care about is staging removals and renames, which, AFAIK, all modern rcs's support.
Diffstat (limited to 'IkiWiki/Rcs/svn.pm')
-rw-r--r--IkiWiki/Rcs/svn.pm51
1 files changed, 45 insertions, 6 deletions
diff --git a/IkiWiki/Rcs/svn.pm b/IkiWiki/Rcs/svn.pm
index 6c15c2ca9..9081c3902 100644
--- a/IkiWiki/Rcs/svn.pm
+++ b/IkiWiki/Rcs/svn.pm
@@ -117,6 +117,28 @@ sub rcs_commit ($$$;$$) { #{{{
return undef # success
} #}}}
+sub rcs_commit_staged ($$$) {
+ # Commits all staged changes. Changes can be staged using rcs_add,
+ # rcs_remove, and rcs_rename.
+ my ($message, $user, $ipaddr)=@_;
+
+ if (defined $user) {
+ $message="web commit by $user".(length $message ? ": $message" : "");
+ }
+ elsif (defined $ipaddr) {
+ $message="web commit from $ipaddr".(length $message ? ": $message" : "");
+ }
+
+ if (system("svn", "commit", "--quiet",
+ "--encoding", "UTF-8", "-m",
+ possibly_foolish_untaint($message),
+ $config{srcdir}) != 0) {
+ warn("svn commit failed\n");
+ return 1; # failure
+ }
+ return undef # success
+}
+
sub rcs_add ($) { #{{{
# filename is relative to the root of the srcdir
my $file=shift;
@@ -139,18 +161,35 @@ sub rcs_remove ($) { #{{{
my $file=shift;
if (-d "$config{srcdir}/.svn") {
- my $parent=dirname($file);
- while (! -d "$config{srcdir}/$parent/.svn") {
- $file=$parent;
- $parent=dirname($file);
- }
-
if (system("svn", "rm", "--force", "--quiet", "$config{srcdir}/$file") != 0) {
warn("svn rm failed\n");
}
}
} #}}}
+sub rcs_rename ($$) { #{{{
+ # filenames relative to the root of the srcdir
+ my ($src, $dest)=@_;
+
+ if (-d "$config{srcdir}/.svn") {
+ # Add parent directory for $dest
+ my $parent=dirname($dest);
+ if (! -d "$config{srcdir}/$parent/.svn") {
+ while (! -d "$config{srcdir}/$parent/.svn") {
+ $parent=dirname($dest);
+ }
+ if (system("svn", "add", "--quiet", "$config{srcdir}/$parent") != 0) {
+ warn("svn add $parent failed\n");
+ }
+ }
+
+ if (system("svn", "mv", "--force", "--quiet",
+ "$config{srcdir}/$src", "$config{srcdir}/$dest") != 0) {
+ warn("svn rename failed\n");
+ }
+ }
+} #}}}
+
sub rcs_recentchanges ($) { #{{{
my $num=shift;
my @ret;