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