Updater.pm.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:2k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. use strict;
  2. use warnings FATAL => 'all';
  3. package SVN::Updater;
  4. use base 'Class::Accessor';
  5. __PACKAGE__->mk_accessors('path', 'changes');
  6. use Carp;
  7. our $VERSION = 0.01;
  8. sub _svn_command {
  9. my ($self, $cmd, @params) = @_;
  10. my $cmd_line = "cd " . $self->path . " && svn $cmd ";
  11. $cmd_line .= join(' ', map { quotemeta($_) } @params) if @params;
  12. my @res = `$cmd_line 2>&1`;
  13. return -1 if ($cmd eq "help" && $?);
  14. confess "Unable to do $cmd_linen" . join('', @res) if $?;
  15. return @res;
  16. }
  17. sub _load_status {
  18. my $self = shift;
  19. foreach ($self->_svn_command('status')) {
  20. chomp;
  21. /^(.).{6}(.+)$/;
  22. push @{ $self->{$1} }, $2;
  23. }
  24. }
  25. # Constructs SVN::Updater instance. Loads current status of the directory
  26. # given by 'path' option.
  27. sub new {
  28. my $self = shift()->SUPER::new(@_);
  29. $self->changes([]) unless $self->changes;
  30. return $self;
  31. }
  32. sub load {
  33. my $self = shift()->new(@_);
  34. $self->_load_status;
  35. return $self;
  36. }
  37. # Give info about current Repos
  38. sub info {
  39. my ($self, @params) = @_;
  40. my $local_ver;
  41. my $global_ver;
  42. $local_ver = $global_ver = 0;
  43. $self->_svn_command('cleanup'); # Cleaup Repos, if something go wrong
  44. foreach ($self->_svn_command('info', @params)) {
  45. chomp;
  46. my ($key, $val) = split(/:/);
  47. $local_ver = int ($val) if (defined $key && $key eq "Revision");
  48. $global_ver = int ($val) if (defined $key && $key eq "Last Changed Rev");
  49. }
  50. return ($local_ver, $global_ver);
  51. };
  52. # Returns array of files which are currently modified.
  53. sub modified {
  54. return shift()->{M} || [];
  55. }
  56. # Returns array of file which are scheduled for addition.
  57. sub added {
  58. return shift()->{A} || [];
  59. }
  60. # Returns array of files which do not exist in svn repository. 
  61. sub unknown {
  62. return shift()->{'?'} || [];
  63. }
  64. # Returns array of files which are scheduled for deletion.
  65. sub deleted {
  66. return shift()->{D} || [];
  67. }
  68. # Returns array of files which are missing from the working directory.
  69. sub missing {
  70. return shift()->{'!'} || [];
  71. }
  72. # Updates current working directory from the latest repository contents.
  73. sub update {
  74. my ($self, @params) = @_;
  75. $self->_svn_command('cleanup'); # Cleaup Repos, if something go wrong
  76. return $self->_svn_command('update', @params);
  77. }
  78. # Diffs the file against the repository.
  79. sub diff {
  80. return join('', shift()->_svn_command('diff', @_));
  81. }
  82. # Checks-out working copy from the REPOSITORY into directory given by 'path' option.
  83. sub checkout {
  84. my ($self, $repository) = @_;
  85. mkdir($self->path) or confess "Unable to create " . $self->path;
  86. return $self->_svn_command('checkout', $repository, '.');
  87. }
  88. 1;