~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/fileservice_lib/action.py

  • Committer: David Coles
  • Date: 2010-07-20 05:55:20 UTC
  • Revision ID: coles.david@gmail.com-20100720055520-yxyfn2qqycfwboiq
URL quote paths in checkout URLs.

The two benefits of this are that we no longer have issues with spaces in 
submitted paths and also don't have to worry about shell escape characters 
(and possible shell injection to a lectures console).

Show diffs side-by-side

added added

removed removed

Lines of Context:
94
94
#       revision: The revision number to update to. If not provided this
95
95
#               defaults to HEAD.
96
96
#
97
 
# action=svnpublish: Set the "published" flag on a file to True.
98
 
#       path:   The path to the file to be published. Can be specified
99
 
#               multiple times.
100
 
#
101
 
# action=svnunpublish: Set the "published" flag on a file to False.
102
 
#       path:   The path to the file to be unpublished. Can be specified
103
 
#               multiple times.
104
 
#
105
97
# action=svncommit: Commit a file(s) or directory(s) to the repository.
106
98
#       path:   The path to the file or directory to be committed. Can be
107
99
#               specified multiple times. Directories are committed
325
317
    """
326
318
    frompath = fields.getfirst('from')
327
319
    topath = fields.getfirst('to')
328
 
    movefile(req, frompath, topath)
 
320
    svn = fields.getfirst('svn')
 
321
    if svn:
 
322
        svn_movefile(req, frompath, topath)
 
323
    else:
 
324
        movefile(req, frompath, topath)
329
325
 
330
326
def action_mkdir(req, fields):
331
327
    """Creates a directory with the given path.
580
576
    Reads fields: 'path' (multiple)
581
577
    """
582
578
    paths = fields.getlist('path')
583
 
    paths = map(lambda path: actionpath_to_local(req, path), paths)
 
579
    paths = map(lambda path: actionpath_to_local(req, path).decode('utf-8'),
 
580
                paths)
584
581
 
585
582
    try:
586
583
        svnclient.add(paths, recurse=True, force=True)
593
590
    Reads fields: 'path' (multiple)
594
591
    """
595
592
    paths = fields.getlist('path')
596
 
    paths = map(lambda path: actionpath_to_local(req, path), paths)
 
593
    paths = map(lambda path: actionpath_to_local(req, path).decode('utf-8'),
 
594
                paths)
597
595
 
598
596
    try:
599
597
        svnclient.remove(paths, force=True)
617
615
                    int(revision))
618
616
        except ValueError, e:
619
617
            raise ActionError("Bad revision number: '%s'"%revision,)
620
 
    path = actionpath_to_local(req, path)
 
618
    path = actionpath_to_local(req, path).decode('utf-8')
621
619
 
622
620
    try:
623
621
        svnclient.update(path, recurse=True, revision=revision)
632
630
    path = fields.getfirst('path')
633
631
    if path is None:
634
632
        raise ActionError("Required field missing")
635
 
    path = actionpath_to_local(req, path)
 
633
    path = actionpath_to_local(req, path).decode('utf-8')
636
634
 
637
635
    try:
638
636
        svnclient.resolved(path, recurse=True)
645
643
    Reads fields: 'path' (multiple)
646
644
    """
647
645
    paths = fields.getlist('path')
648
 
    paths = map(lambda path: actionpath_to_local(req, path), paths)
 
646
    paths = map(lambda path: actionpath_to_local(req, path).decode('utf-8'),
 
647
                paths)
649
648
 
650
649
    try:
651
650
        svnclient.revert(paths, recurse=True)
652
651
    except pysvn.ClientError, e:
653
652
        raise ActionError(str(e))
654
653
 
655
 
def action_svnpublish(req, fields):
656
 
    """Sets svn property "ivle:published" on each file specified.
657
 
    Should only be called on directories (only effective on directories
658
 
    anyway).
659
 
 
660
 
    Reads fields: 'path'
661
 
 
662
 
    XXX Currently unused by the client (calls action_publish instead, which
663
 
    has a completely different publishing model).
664
 
    """
665
 
    paths = fields.getlist('path')
666
 
    if len(paths):
667
 
        paths = map(lambda path: actionpath_to_local(req, path), paths)
668
 
    else:
669
 
        paths = [studpath.to_home_path(req.path)]
670
 
 
671
 
    try:
672
 
        for path in paths:
673
 
            # Note: Property value doesn't matter
674
 
            svnclient.propset("ivle:published", "", path, recurse=False)
675
 
    except pysvn.ClientError, e:
676
 
        raise ActionError("Directory could not be published")
677
 
 
678
 
def action_svnunpublish(req, fields):
679
 
    """Deletes svn property "ivle:published" on each file specified.
680
 
 
681
 
    Reads fields: 'path'
682
 
 
683
 
    XXX Currently unused by the client (calls action_unpublish instead, which
684
 
    has a completely different publishing model).
685
 
    """
686
 
    paths = fields.getlist('path')
687
 
    paths = map(lambda path: actionpath_to_local(req, path), paths)
688
 
 
689
 
    try:
690
 
        for path in paths:
691
 
            svnclient.propdel("ivle:published", path, recurse=False)
692
 
    except pysvn.ClientError, e:
693
 
        raise ActionError("Directory could not be unpublished")
694
 
 
695
654
def action_svncommit(req, fields):
696
655
    """Performs a "svn commit" to each file specified.
697
656
 
698
657
    Reads fields: 'path' (multiple), 'logmsg' (optional)
699
658
    """
700
659
    paths = fields.getlist('path')
701
 
    paths = map(lambda path: actionpath_to_local(req, str(path)), paths)
702
 
    logmsg = str(fields.getfirst('logmsg', DEFAULT_LOGMESSAGE))
 
660
    if len(paths):
 
661
        paths = map(lambda path:actionpath_to_local(req,path).decode('utf-8'),
 
662
                    paths)
 
663
    else:
 
664
        paths = [studpath.to_home_path(req.path).decode('utf-8')]
 
665
    logmsg = str(fields.getfirst('logmsg',
 
666
                 DEFAULT_LOGMESSAGE)).decode('utf-8')
703
667
    if logmsg == '': logmsg = DEFAULT_LOGMESSAGE
704
668
 
705
669
    try:
717
681
        raise ActionError("usage: svncheckout url local-path")
718
682
    url = ivle.conf.svn_addr + "/" + urllib.quote(paths[0])
719
683
    local_path = actionpath_to_local(req, str(paths[1]))
 
684
    url = url.decode('utf-8')
 
685
    local_path = local_path.decode('utf-8')
720
686
    try:
721
687
        svnclient.checkout(url, local_path, recurse=True)
722
688
    except pysvn.ClientError, e:
729
695
    """
730
696
    path = fields.getfirst('path')
731
697
    logmsg = fields.getfirst('logmsg')
732
 
    url = ivle.conf.svn_addr + "/" + urllib.quote(path)
 
698
    url = (ivle.conf.svn_addr + "/" + urllib.quote(path)).decode('utf-8')
733
699
    try:
734
700
        svnclient.mkdir(url, log_message=logmsg)
735
701
    except pysvn.ClientError, e:
743
709
    Reads fields: 'path'
744
710
    """
745
711
    path = fields.getfirst('path')
746
 
    url = ivle.conf.svn_addr + "/" + urllib.quote(path)
 
712
    url = (ivle.conf.svn_addr + "/" + urllib.quote(path)).decode('utf-8')
747
713
    svnclient.exception_style = 1
748
714
 
749
715
    try:
756
722
    except pysvn.ClientError, e:
757
723
        # Error code 170000 means ENOENT in this revision.
758
724
        if e[1][0][1] == 170000:
759
 
            raise util.IVLEError(404, 'The specified repository path does not exist')
 
725
            req.status = 404
 
726
            raise ActionError('The specified repository path does not exist')
760
727
        else:
761
728
            raise ActionError(str(e[0]))
762
729
 
769
736
    path = fields.getfirst('path')
770
737
    if path is None:
771
738
        raise ActionError("Required field missing")
772
 
    path = actionpath_to_local(req, path)
 
739
    path = actionpath_to_local(req, path).decode('utf-8')
773
740
 
774
741
    try:
775
742
        svnclient.cleanup(path)
795
762
    "svnupdate" : action_svnupdate,
796
763
    "svnresolved" : action_svnresolved,
797
764
    "svnrevert" : action_svnrevert,
798
 
    "svnpublish" : action_svnpublish,
799
 
    "svnunpublish" : action_svnunpublish,
800
765
    "svncommit" : action_svncommit,
801
766
    "svncheckout" : action_svncheckout,
802
767
    "svnrepomkdir" : action_svnrepomkdir,